//
//  KRMapController.m
//  KRSport
//
//  Created by KaoRny on 17/4/22.
//  Copyright © 2017年 KaoRny. All rights reserved.
//

#import "KRMapController.h"
#import <MAMapKit/MAMapKit.h>
#import <AMapFoundationKit/AMapFoundationKit.h>

@interface KRMapController ()<MAMapViewDelegate>

//记录是否添加了大头针
@property (nonatomic, assign) BOOL hasSetAnnotation;
@end

@implementation KRMapController

- (void)viewDidLoad {
    [super viewDidLoad];
    //为了更好的使第三方类库和项目解耦和,将带界面的功能封装到视图控制器中
    ///初始化地图
    _mapView = [[MAMapView alloc] initWithFrame:self.view.bounds];
    
    ///把地图添加至view
    [self.view addSubview:_mapView];
    
    //设置地图
    [self setupMapView];
}

- (void) setupMapView
{
    /**
     * 高德地图  2D 和 3D 的区别:
     1> 2D 不能旋转 使用的是切片的方式 下载的是地图图片 如果实现旋转会导致内存暴涨(所有的图片都要进行transform)   优缺点: 流量使用大,下载时间长  CPU使用少
     2> 3D 下载的是地图数据  在客户端根据数据进行绘制  数据显示快,CPU使用多 注意避免内存/CPU峰值
     */
    //隐藏标尺/比例尺
    _mapView.showsScale = NO;
    //关闭3D旋转
    _mapView.rotateCameraEnabled = NO;
    ///如果您需要进入地图就显示定位小蓝点，则需要下面两行代码
    _mapView.showsUserLocation = YES;
    _mapView.userTrackingMode = MAUserTrackingModeFollow;
    //开启后台运行
    _mapView.allowsBackgroundLocationUpdates = YES;
    //取消自动暂停
    _mapView.pausesLocationUpdatesAutomatically = NO;
    //设置代理
    _mapView.delegate = self;
}
# pragma mark - MAMapViewDelegate代理方法

/**
 单击地图时调用

 @param mapView 地图
 @param coordinate 点击位置的经纬度
 */
- (void)mapView:(MAMapView *)mapView didSingleTappedAtCoordinate:(CLLocationCoordinate2D)coordinate
{
    //构造折线数据对象
    CLLocationCoordinate2D commonPolylineCoords[2];
    commonPolylineCoords[0].latitude = self.mapView.userLocation.location.coordinate.latitude;
    commonPolylineCoords[0].longitude = self.mapView.userLocation.location.coordinate.longitude;
    
    commonPolylineCoords[1].latitude = coordinate.latitude;
    commonPolylineCoords[1].longitude = coordinate.longitude;
    
    //构造折线对象
    MAPolyline *commonPolyline = [MAPolyline polylineWithCoordinates:commonPolylineCoords count:2];
    
    //在地图上添加折线对象
    [_mapView addOverlay: commonPolyline];
}

//已经更新用户位置后调用
- (void)mapView:(MAMapView *)mapView didUpdateUserLocation:(MAUserLocation *)userLocation updatingLocation:(BOOL)updatingLocation
{
    //过滤掉方向改变触发的更新事件
    if (updatingLocation == NO) {
        
        return;
    }
    //更新位置后,设置地图中心点
    _mapView.centerCoordinate = userLocation.location.coordinate;
    
    if (self.hasSetAnnotation == NO && self.track.startAnnotation)
    {
        //添加起点大头针
        [_mapView addAnnotation:self.track.startAnnotation];
        self.hasSetAnnotation = YES;
    }
    
    //生成新的折线 每段起点都是上一段的终点 所以不用传起点
    MAPolyline *polyLine = [self.track addPolyklineWithDest:userLocation.location];
    //添加折线
    [_mapView addOverlay:polyLine];
}

//设置大头针视图 
- (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id<MAAnnotation>)annotation
{
    if ([annotation isKindOfClass:[MAPointAnnotation class]])
    {
        static NSString *reuseIndetifier = @"annotationReuseIndetifier";
        MAAnnotationView *annotationView = (MAAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:reuseIndetifier];
        if (annotationView == nil)
        {
            annotationView = [[MAAnnotationView alloc] initWithAnnotation:annotation
                                                          reuseIdentifier:reuseIndetifier];
        }
        //设置图片
        annotationView.image = [UIImage imageNamed:self.track.sportTypeImageName];
        //设置中心点偏移，使得标注底部中间点成为经纬度对应点
        annotationView.centerOffset = CGPointMake(0, -annotationView.image.size.height * .5);
        return annotationView;
    }
    return nil;
}

//折线样式
- (MAOverlayRenderer *)mapView:(MAMapView *)mapView rendererForOverlay:(id <MAOverlay>)overlay
{
    if ([overlay isKindOfClass:[KRSportPolyLine class]])
    {
        MAPolylineRenderer *polylineRenderer = [[MAPolylineRenderer alloc] initWithPolyline:overlay];
        //线宽
        polylineRenderer.lineWidth    = 4.f;
        //描边颜色 根据折线的速度来改变
        KRSportPolyLine *polyLine = overlay;
        polylineRenderer.strokeColor  = polyLine.storkeColor;
        //拐点样式
        polylineRenderer.lineJoinType = kMALineJoinRound;
        //头尾样式
        polylineRenderer.lineCapType  = kMALineCapRound;
        
        return polylineRenderer;
    }
    
    return nil;
}
@end
